www.gusucode.com > VC++ SYN高速端口扫描器源代码-源码程序 > VC++ SYN高速端口扫描器源代码-源码程序/code/SynScanPort/SynScanPortDlg.cpp
//Download by http://www.NewXing.com // SynScanPortDlg.cpp : implementation file // #include "stdafx.h" #include <winsock2.h> #include "SynScanPort.h" #include "SynScanPortDlg.h" #include "Ping.h" #include <ws2tcpip.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") #if _MSC_VER > 1000 #pragma once #endif #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2) #define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3) #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) #define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5) #define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6) #define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7) #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8) #define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9) #define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10) #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11) struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #define srcPort 88 char srcIP[20] = "";//定义源地址 int StartPort,EndPort; CSynScanPortDlg *dlg=NULL; typedef struct ip_hdr { unsigned char h_verlen; //4位首部长度,4位IP版本号 unsigned char tos; //8位服务类型TOS unsigned short total_len; //16位总长度(字节) unsigned short ident; //16位标识 unsigned short frag_and_flags; //3位标志位 unsigned char ttl; //8位生存时间 TTL unsigned char proto; //8位协议 (TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和 unsigned int sourceIP; //32位源IP地址 unsigned int destIP; //32位目的IP地址 }IP_HEADER; typedef struct tcp_hdr //定义TCP首部 { USHORT th_sport; //16位源端口 USHORT th_dport; //16位目的端口 unsigned int th_seq; //32位序列号 unsigned int th_ack; //32位确认号 unsigned char th_lenres; //4位首部长度/6位保留字 unsigned char th_flag; //6位标志位 USHORT th_win; //16位窗口大小 USHORT th_sum; //16位校验和 USHORT th_urp; //16位紧急数据偏移量 }TCP_HEADER; typedef struct tsd_hdr //定义TCP伪首部 { unsigned long saddr; //源地址 unsigned long daddr; //目的地址 char mbz; char ptcl; //协议类型 unsigned short tcpl; //TCP长度 }PSD_HEADER; int recv_packet() { SOCKADDR_IN sniff; SOCKET sock; char recvBuffer[65000] = ""; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); sniff.sin_family = AF_INET; sniff.sin_port = htons(0); sniff.sin_addr.s_addr = inet_addr(srcIP); bind(sock,(PSOCKADDR)&sniff,sizeof(sniff)); DWORD dwBufferLen[10] ; DWORD dwBufferInLen = 1; DWORD dwBytesReturned = 0 ; WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL); printf("Sniffer On %s is OK...\n",srcIP); while(TRUE) { memset(recvBuffer,0,sizeof(recvBuffer)); int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0); if(bytesRecived <= 0) continue; IP_HEADER *ipHeader; TCP_HEADER *tcpHeader; ipHeader = (IP_HEADER *)recvBuffer; tcpHeader = (TCP_HEADER *) (recvBuffer+sizeof(IP_HEADER)); //if(tcpHeader->th_seq == 0x12345678+2) { if(tcpHeader->th_flag == 18) { char result[50]; in_addr addr; addr.s_addr = ipHeader->sourceIP; wsprintf(result,"[Found] %-15s %-5d\r\n",inet_ntoa(addr),ntohs(tcpHeader->th_sport)); dlg->m_show += result; dlg->SetDlgItemText(IDC_RICHEDIT_SHOW,dlg->m_show); } } } return 1; } USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum += *buffer++; size -= sizeof(USHORT); } if(size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >> 16); return (USHORT)(~cksum); } int send_packet(void *targetIP) { WSADATA WSAData; WSAStartup(MAKEWORD(2,1) ,&WSAData); SOCKET sendSocket; BOOL flag; int timeout; SOCKADDR_IN sin; IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHeader; char szSendBuf[60] = ""; if((sendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) { printf("Socket Setup Error...\n"); return 0; } if(setsockopt(sendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR) { printf("Setsockopt IP_HDRINCL Error...\n"); return 0; } timeout = 1000; if(setsockopt(sendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == SOCKET_ERROR) { printf("Setsockopt SO_SNDTIMEO Error...\n"); return 0; } ipHeader.h_verlen = (4<<4 | sizeof(ipHeader)/sizeof(unsigned long)); ipHeader.total_len = htons(sizeof(ipHeader)+sizeof(tcpHeader)); ipHeader.ident = 1; ipHeader.frag_and_flags = 0x40; ipHeader.ttl = 128; ipHeader.proto = IPPROTO_TCP; ipHeader.checksum = 0; ipHeader.sourceIP = inet_addr(srcIP); ipHeader.destIP = inet_addr((char *)targetIP); tcpHeader.th_sport = htons(srcPort); tcpHeader.th_seq = 0x12345678; tcpHeader.th_ack = 0; tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0); tcpHeader.th_flag = 2;//syn标志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG(推测,哈哈) tcpHeader.th_win = htons(512); tcpHeader.th_urp = 0; tcpHeader.th_sum = 0; psdHeader.saddr = ipHeader.sourceIP; psdHeader.daddr = ipHeader.destIP; psdHeader.mbz = 0; psdHeader.ptcl = IPPROTO_TCP; psdHeader.tcpl = htons(sizeof(tcpHeader)); for(int tmp = StartPort; tmp <= EndPort; tmp++) { ipHeader.checksum = 0; tcpHeader.th_sum = 0; tcpHeader.th_dport = htons(tmp); sin.sin_family = AF_INET; sin.sin_port = htons(tmp); sin.sin_addr.S_un.S_addr = inet_addr((char *)targetIP); memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4); ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); int ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin)); if(ret == SOCKET_ERROR) { printf("Send Error:%d\n",GetLastError()); return 0; } } /* memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4); ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); int ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin)); if(ret == SOCKET_ERROR) { printf("Send Error:%d\n",GetLastError()); return 0; }*/ return 1; } #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CSynScanPortDlg dialog CSynScanPortDlg::CSynScanPortDlg(CWnd* pParent /*=NULL*/) : CDialog(CSynScanPortDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSynScanPortDlg) m_endport = 65535; m_startport = 0; m_show = _T("显示结果...\r\n"); m_ip = _T("192.168.159.1"); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSynScanPortDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSynScanPortDlg) DDX_Control(pDX, IDOK, m_btnok); DDX_Control(pDX, IDC_EDIT_STARTPORT, m_edit_startport); DDX_Control(pDX, IDC_EDIT_IP, m_edit_ip); DDX_Control(pDX, IDC_EDIT_ENDPORT, m_edit_endport); DDX_Control(pDX, IDC_BUTTON_PING, m_btn_ping); DDX_Control(pDX, IDC_BUTTON_OUT, m_btn_out); DDX_Control(pDX, IDC_BUTTON_CLEAN, m_btn_clean); DDX_Text(pDX, IDC_EDIT_ENDPORT, m_endport); DDX_Text(pDX, IDC_EDIT_STARTPORT, m_startport); DDX_Text(pDX, IDC_RICHEDIT_SHOW, m_show); DDX_Text(pDX, IDC_EDIT_IP, m_ip); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSynScanPortDlg, CDialog) //{{AFX_MSG_MAP(CSynScanPortDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_OUT, OnButtonOut) ON_BN_CLICKED(IDC_BUTTON_CLEAN, OnButtonClean) ON_BN_CLICKED(IDC_BUTTON_PING, OnButtonPing) ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSynScanPortDlg message handlers BOOL CSynScanPortDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_wndLink1.SubclassDlgItem(IDC_URL1, this); m_btnok.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); m_btnok.SetFontColor(RGB(100,50,280)); m_btn_ping.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); m_btn_ping.SetFontColor(RGB(100,50,280)); m_btn_out.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); m_btn_out.SetFontColor(RGB(100,50,280)); m_btn_clean.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); m_btn_clean.SetFontColor(RGB(100,50,280)); // TODO: Add extra initialization here char FAR hostname[128] = ""; struct hostent *phe; WSADATA WSAData; WSAStartup(MAKEWORD(2,1) ,&WSAData); gethostname(hostname,128); phe = gethostbyname(hostname); if(phe == NULL) exit(0); strcpy(srcIP, inet_ntoa(*((struct in_addr *)phe->h_addr_list[0]))); SetDlgItemText(IDC_EDIT_IP,srcIP); StartPort = 0; EndPort = 0; dlg = this; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recv_packet,NULL,0,NULL); return TRUE; // return TRUE unless you set the focus to a control } void CSynScanPortDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CSynScanPortDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CSynScanPortDlg::OnOK() { UpdateData(TRUE); StartPort = m_startport; EndPort = m_endport; AfxBeginThread((AFX_THREADPROC)send_packet,(void *)m_ip.GetBuffer(0)); } void CSynScanPortDlg::OnButtonOut() { CFileDialog fileDialog(TRUE,"*.txt",NULL,NULL,"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"); if (fileDialog.DoModal() == IDOK) { CString m_file = fileDialog.GetPathName(); CFile file; file.Open(m_file,CFile::modeCreate|CFile::modeWrite); file.Write(m_show.GetBuffer(0),m_show.GetLength()); file.Write("\r\n\r\n\t\tby 特南克斯\r\n",strlen("\r\n\r\n\t\tby 特南克斯\r\n")); file.Close(); MessageBox("导出成功","导出列表"); } } void CSynScanPortDlg::OnButtonClean() { m_show="显示结果..."; UpdateData(FALSE); } void CSynScanPortDlg::OnButtonPing() { UpdateData(TRUE); CPing ping; ping.SetConfigure(m_ip.GetBuffer(0),32,4); ping.Ping(1000); CString str; str.Format("%s",ping.msg); m_show+=str; UpdateData(FALSE); } void CSynScanPortDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ::SendMessage(this->GetSafeHwnd(),WM_SYSCOMMAND,SC_MOVE+HTCAPTION,0); CDialog::OnLButtonDown(nFlags, point); }